package single;

/**
 * @author lyx
 * @Date 2021/6/27 10:59
 */
public class LazyMan {

    //用DCl必须要加volatile，保证lazyMan不被指令重排！！
    private  volatile static LazyMan lazyMan;

    //懒汉式，用的时候再new
    public static LazyMan getInstance(){
        //DCL 双重检测锁
        if(lazyMan==null){
            synchronized (LazyMan.class){//锁这个类，仅有一个
                if(lazyMan==null){
                    lazyMan = new LazyMan();//new不是一个原子性操作，底层有多个步骤，可能会被指令重排
                }
            }
        }
        return lazyMan;
    }

    private LazyMan(){
        System.out.println(Thread.currentThread().getName()+" ==> run ok.");
    }

    public static void main(String[] args) {
        //跑10个线程，正确结果应该是只跑1个线程 。
        for (int i = 0; i < 10; i++) {
            new Thread(()->{
                LazyMan.getInstance();
            }).start();
        }
    }

}
